const { sendFn, querySql, intercept } = require('../model/send')
    // 引入实现文件上传的模块
const { IncomingForm } = require('formidable')
const path = require('path')
const fs = require('fs')
let oldPath = '',
    newPath = ''
    // 创建长连接，双工通信协议
const upload = (req, res) => {
    // 实现文件上传

    // 1.创建文件上传对象
    let form = new IncomingForm()

    // 2.添加必要的配置
    // 2.1 设置编码,formidable也可 接收普通键值对，这个时候就有需要设置编码，如果只是上传文件，则不用设置
    // form.encoding = 'utf-8'
    // // 2.2 设置上传文件的存放路径，一定给一个全路径，否则报错
    const date = new Date().getFullYear() + '-' + (new Date().getMonth() + 1) + '-' + new Date().getDate()
    const SFM = `${new Date().getHours()}${new Date().getMinutes()}${new Date().getSeconds()}`
    console.log(SFM)

    const files = fs.readdirSync(__dirname + '/storage')
    if (files.includes(date)) {
        form.parse(req, (err, fields, files) => {
            const imgUrl = '/' + date + '/' + files.file.originalFilename
                /*我们需要获取对应的图片的后缀名,需要利用files.tupian.path来获取对应的后缀名*/
                /*1.3获取后缀名*/
            var extName = path.extname(files.file.originalFilename)
                /*1.4设置新的路径
                 * 当我们使用新的路径替换旧的路径的时候,我们一般使用全路径所以我们设置
                 * 如果想要放在upload文件中，则需要拼接两个/upload，因为系统会将最后一个斜杠之前的都解析成目录，后面的都是文件名
                 * 路径的时候,最好使用全路径*/

            newPath = __dirname + '/storage' + imgUrl
            console.log(newPath)

            /*1.5获取旧的路径*/
            oldPath = files.file.filepath

            /*1.6使用新的路径替换旧的路径
             * rename:重命名
             * 第一个参数表示旧的路径
             *第二个参数表示新的路径
             * 第三个参数表示回调*/
            if (err) return sendFn(res, 500, '文件上传失败', err)

            fs.rename(oldPath, newPath, function(err) {
                console.log(newPath)
                if (err) {
                    console.log('重命名不成功', err)
                    sendFn(res, 500, '上传失败', err)

                    return
                }
                sendFn(res, 200, '上传成功', {
                    allPaths: 'http://' + getIpAddress() + ':13309/upload/storage' + imgUrl,
                    Paths: '/upload/storage' + imgUrl
                })
            })
        })
    } else {
        fs.mkdir(__dirname + '/storage/' + date, function(err) {
            if (err) return sendFn(res, 500, '文件上传失败=>文件创建失败=>' + err)
            form.uploadDir = __dirname + '/storage/' + date
                // // 2.3 设置是否保留文件的扩展名，默认不保留
            form.options.keepExtensions = true
                // 3.调用上传方法,实现文件上传
                // form.parse(请求报文，回调函数)
                // err:文件上传失败时的错误信息
                // fields：接收到普通键值对--对象
                // files：文件的相关信息,特别是上传成功后在服务器端的信息
            form.parse(req, (err, fields, files) => {
                /*我们需要获取对应的图片的后缀名,需要利用files.tupian.path来获取对应的后缀名*/
                /*1.3获取后缀名*/
                const imgUrl = '/' + date + '/' + files.file.originalFilename
                var extName = path.extname(files.file.originalFilename)

                if (err) return sendFn(res, 500, '文件上传失败', err)

                fs.rename(oldPath, newPath, function(err) {
                    // if (err) {
                    //     console.log('重命名不成功', err)
                    //     sendFn(res, 500, '上传失败', err)

                    //     return
                    // }
                    sendFn(res, 200, '上传成功', { imgUrl: 'http://' + getIpAddress() + ':3308/nodeServe/serve' + imgUrl })
                })
            })
        })
    }
}

const os = require('os')
    //获取本机ip
function getIpAddress() {
    /**os.networkInterfaces() 返回一个对象，该对象包含已分配了网络地址的网络接口 */
    var interfaces = os.networkInterfaces()
    for (var devName in interfaces) {
        var iface = interfaces[devName]
        for (var i = 0; i < iface.length; i++) {
            var alias = iface[i]
            if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal) {
                return alias.address
            }
        }
    }
}
const myHost = getIpAddress()
console.log(myHost)

module.exports = upload